package com.cskaoyan.javase.object._5finalize;

import java.util.Scanner;

/**
 * finalize方法是一个没有任何作用的方法,请大家不要使用
 * 体现了Java GC自动垃圾回收的缺点：程序员缺乏对对象销毁的控制，对象的垃圾回收具有不确定性，没有时效性。那么连带着finalize方法的执行也是不确定的。在这段不确定长度的时间里，对象其实早就已经没用了，但系统资源还是一直被占用着，造成资源的浪费。 显然释放系统资源这么一件重要的事情，不能依赖于一个不稳定的机制。
 *
 * 从Java9开始，Java官方正式将该方法标记为@Deprecated，表示这个方法已经被放弃使用了。
 *
 * 从现在开始,应该认识到对于Java对象使用时所占用的额外资源的释放
 * 需要完全依赖于程序员手动完成
 * 尤其是Java IO 多线程 网络等一定不要忘记资源释放
 *
 * @since 16:30
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new Student();
        // 通知GC进行垃圾回收(但是具体是否销毁对象是不确定的)
        System.gc();

        Scanner sc = new Scanner(System.in);
        System.out.println(sc.nextLine());
        sc.close();
        sc.nextLine();
    }
}

class Student {
    // 该方法,会在任意Student对象被销毁时自动调用
    @Override
    protected void finalize() throws Throwable {
        System.out.println("模拟释放Student对象占用的额外资源代码执行~~~");
    }
}